12#ifndef ROC_CORE_LIST_H_
13#define ROC_CORE_LIST_H_
30template <
class T,
template <
class TT>
class Ownership = RefCntOwnership>
36 typedef typename Ownership<T>::Pointer
Pointer;
53 check_is_member_(data,
this);
55 next_data = data->
next;
58 Ownership<T>::release(*container_of_(data));
76 return container_of_(head_.
next);
86 return container_of_(head_.
prev);
99 check_is_member_(data,
this);
101 if (data->
next == &head_) {
104 return container_of_(data->
next);
117 insert_(element, NULL);
119 insert_(element, container_of_(head_.
next));
132 insert_(element, NULL);
145 insert_(element, &before);
158 check_is_member_(data,
this);
167 Ownership<T>::release(element);
175 static void check_is_member_(
const ListNode::ListNodeData* data,
const List* list) {
176 if (data->list != list) {
177 roc_panic(
"list element is member of wrong list: expected %p, got %p",
178 (
const void*)list, (
const void*)data->list);
182 void insert_(T& element, T* before) {
183 ListNode::ListNodeData* data_new = element.list_node_data();
184 check_is_member_(data_new, NULL);
186 ListNode::ListNodeData* data_before;
187 if (before != NULL) {
188 data_before = before->list_node_data();
189 check_is_member_(data_before,
this);
191 data_before = &head_;
194 data_new->
next = data_before;
198 data_before->
prev = data_new;
200 data_new->
list =
this;
204 Ownership<T>::acquire(element);
207 ListNode::ListNodeData head_;
Intrusive doubly-linked list.
void push_back(T &element)
Append element to list.
Pointer nextof(T &element) const
Get list element next to given one.
void remove(T &element)
Remove element from list.
void insert_before(T &element, T &before)
Insert element into list.
Pointer front() const
Get first list element.
Ownership< T >::Pointer Pointer
Pointer type.
~List()
Release ownership of containing objects.
Pointer back() const
Get last list element.
size_t size() const
Get number of elements in list.
List()
Initialize empty list.
void push_front(T &element)
Prepend element to list.
Base class for non-copyable objects.
#define roc_panic_if(x)
Panic if condition is true.
#define roc_panic(...)
Print error message and terminate program gracefully.
Commonly used types and functions.
ListNode * container_of()
Get ListNode object that contains this ListData object.
ListNodeData * next
Next list element.
ListNodeData * prev
Previous list element.
void * list
The list this node is member of.